isf 0.1.0

Parsing, Deserialization and Serialization of the Interactive Shader Format.
Documentation
/*{
    "CATEGORIES": [
        "Distortion Effect"
    ],
    "CREDIT": "by VIDVOX",
    "DESCRIPTION": "Shifts pixels up and down",
    "INPUTS": [
        {
            "NAME": "inputImage",
            "TYPE": "image"
        },
        {
            "DEFAULT": 0,
            "LABEL": "Horizontal Phase",
            "MAX": 1,
            "MIN": 0,
            "NAME": "hPhase",
            "TYPE": "float"
        },
        {
            "DEFAULT": 1,
            "LABEL": "Horizontal Frequency",
            "MAX": 16,
            "MIN": -16,
            "NAME": "hFrequency",
            "TYPE": "float"
        },
        {
            "DEFAULT": 0,
            "LABEL": "Horizontal Random",
            "MAX": 1,
            "MIN": 0,
            "NAME": "hRandom",
            "TYPE": "float"
        },
        {
            "DEFAULT": 0,
            "LABEL": "Vertical Phase",
            "MAX": 1,
            "MIN": 0,
            "NAME": "vPhase",
            "TYPE": "float"
        },
        {
            "DEFAULT": 0,
            "LABEL": "Vertical Frequency",
            "MAX": 16,
            "MIN": -16,
            "NAME": "vFrequency",
            "TYPE": "float"
        },
        {
            "DEFAULT": 0,
            "LABEL": "Vertical Random",
            "MAX": 1,
            "MIN": 0,
            "NAME": "vRandom",
            "TYPE": "float"
        },
        {
            "DEFAULT": 1,
            "LABEL": "Sinusoidal",
            "NAME": "doSin",
            "TYPE": "bool"
        },
        {
            "DEFAULT": 1,
            "LABEL": "Mirror",
            "NAME": "mirror",
            "TYPE": "bool"
        }
    ],
    "ISFVSN": "2"
}
*/


float		PI_CONST = 3.14159265359;


float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}


void main()
{
	//	start with the pixel
	vec2 loc = isf_FragNormCoord;
	float modVal = 1.0;
	
	if (mirror)
		modVal = 2.0;
	
	//	shift the loc.x by the frequency * loc.y + phase
	if (doSin)
		loc.x = mod(hRandom * rand(vec2(TIME * 0.127, loc.x)) + loc.x + sign(hFrequency) * 0.5 * (1.0+cos(2.0 * PI_CONST * (hPhase + hFrequency * loc.y))), modVal);
	else
		loc.x = mod(hRandom * rand(vec2(TIME * 0.129, loc.x)) + loc.x + hFrequency * loc.y + hPhase, modVal);

	//	shift the loc.y by the frequency * loc.x + phase
	if (doSin)
		loc.y = mod(vRandom * rand(vec2(TIME * 0.273, loc.y)) + loc.y + sign(vFrequency) * 0.5 * (1.0+cos(2.0 * PI_CONST * (vPhase + vFrequency * loc.x))), modVal);
	else
		loc.y = mod(vRandom * rand(vec2(TIME * 0.341, loc.y)) +loc.y + vFrequency * loc.x + vPhase, modVal);
		
	if (loc.x > 1.0)
		loc.x = 2.0 - loc.x;
		
	if (loc.y > 1.0)
		loc.y = 2.0 - loc.y;
	
	gl_FragColor = IMG_NORM_PIXEL(inputImage,loc);
}